//////////////////////  系统层面的文件操作

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <unistd.h>

////////////////////////  open 博客讲解示例代码
//int main()
//{	
//	//用三个参数的 
//	//默认我当前的路径下是没有 log.txt 的  
////	int fd = open("log.txt" ,O_CREAT | O_WRONLY | O_TRUNC,0666);
////	int fd = open("log.txt" ,O_CREAT | O_WRONLY | O_APPEND,0666);
//	umask(0);
//
//	int fd = open("log.txt" ,O_CREAT | O_WRONLY,0666);
//
////	int fd = open("log.txt" ,O_CREAT);
//	if(fd < 0)
//	{
//		perror("open fail !\n");
//		return 1;
//	}
//	
//	//写文件
//	// write
////	const char* str = "Hello\n";
////	const char* str = "12";
////	write(fd , str , strlen(str));
//	return 0;
//}




/////////////////////////////////  系统文件操作使用 

// 写 
//int main()
//{	
//	int fd = open("log.txt" , O_CREAT | O_WRONLY | O_TRUNC , 0666);
//	if(fd < 0)
//	{
//		perror("open fail\n");
//		return 1;
//	}
//
//	//写	
//	// 写字符串	
//	//const char* buf = "Hello Linux!\n";
//	//               描述符  写的内容  写入的总字节数
//	//ssize_t st = write(fd ,   buf ,   strlen(buf));	
//
//	// 写数
//	// 1234
//	int num = 1234;
//	//要转换成字符 , 再写入 , 因为打印在显示器上的本质是一个一个字符 '1' , '2'....
//	char buff[20];
//	snprintf(buff ,sizeof(buff) , "%d" , num);			
//	
//	//// 上面的操作就是把这个 1234 数字当字符串打印到 buff 这个字符数组中
//	
//	//写字符                      字符串的总长度
//	ssize_t st = write(fd , buff , strlen(buff));
//
//		
//	//关闭文件
//	close(fd);
//	
//	return 0;
//}

	
// 读 , log.txt 已经存在

//int main()
//{
//	int fd = open("log.txt" , O_RDONLY);
//	
//	if(fd < 0)
//	{
//		perror("open fail\n");
//		return 1;
//	}
//	
//	char buff[20];	
//	
//	//读 , 直到文件末尾了才停止
//	while(1)
//	{	
//		//************   不读取 \0 ***********
//		ssize_t st = read(fd , buff , sizeof(buff)-1);
//		if(st < 0) return 1;
//
//		if(st > 0)
//		{
//			//C语言规定 , 字符串以 \0 结尾 
//			//这里加上字符串
//			buff[st] = 0; // 加上 \0 打印
//			printf("%s" , buff);
//		}
//		// 文件末尾停止
//		if(st == 0)
//			break; 	
//	}
//		
//	close(fd); 	
//	return 0;
//}



/////////////////////////////// 完整的使用


int main()
{
	int fd = open("test.txt" , O_CREAT | O_WRONLY | O_TRUNC , 0666);

	if(fd < 0 )
	{
		perror("open fail\n");	
		return 2; // no file 
	}
		
	// 写	
	const char* str = "Hello Linux! , 并且我是来自 test.txt 文件中的内容\n";
	//				期望写H~\n 
	ssize_t ret = write(fd ,str  , strlen(str));
	int fd1 = open("receive.txt" , O_WRONLY);
	//开始读 , 读的内容写到 fd1 中
	if(fd1 > 0)
	{
			char buff[20];
			//读 , 读到另一个文件中 , receive.txt 中
			ssize_t renum = read(fd , buff , sizeof(buff)-1); // 不读 \0
			if(renum > 0)	
			{
				//写入到另一个文件
				write(fd1 , buff , strlen(buff));	
			}		
	}
	if(fd1 < 0) return 1;
	close(fd);
	close(fd1);
	return 0;
}
